package com.ffggffgfv.backend.service.impl;

import com.ffggffgfv.backend.dto.PageResult;
import com.ffggffgfv.backend.dto.ShelfQueryDTO;
import com.ffggffgfv.backend.entity.Shelf;
import com.ffggffgfv.backend.entity.ShelfProduct;
import com.ffggffgfv.backend.mapper.ShelfMapper;
import com.ffggffgfv.backend.mapper.ShelfProductMapper;
import com.ffggffgfv.backend.service.ShelfService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * 货架服务实现类
 */
@Service
public class ShelfServiceImpl implements ShelfService {

    @Autowired
    private ShelfMapper shelfMapper;

    @Autowired
    private ShelfProductMapper shelfProductMapper;

    /**
     * 获取所有货架
     *
     * @return 货架列表
     */
    @Override
    public List<Shelf> findAll() {
        return shelfMapper.selectAll();
    }

    /**
     * 分页查询货架
     *
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    @Override
    public PageResult<Shelf> findByPage(ShelfQueryDTO queryDTO) {
        // 计算偏移量
        int offset = (queryDTO.getPageNum() - 1) * queryDTO.getPageSize();

        // 查询总数
        long total = shelfMapper.countByCondition(queryDTO);

        // 查询当前页数据
        List<Shelf> shelves = shelfMapper.selectByCondition(queryDTO, offset, queryDTO.getPageSize());

        // 返回分页结果
        return new PageResult<>(shelves, total, queryDTO.getPageNum(), queryDTO.getPageSize());
    }

    /**
     * 根据ID查询货架
     *
     * @param id 货架ID
     * @return 货架对象
     */
    @Override
    public Shelf findById(Long id) {
        return shelfMapper.selectById(id);
    }

    /**
     * 根据商家ID查询货架列表
     *
     * @param merchantId 商家ID
     * @return 货架列表
     */
    @Override
    public List<Shelf> findByMerchantId(Long merchantId) {
        return shelfMapper.selectByMerchantId(merchantId);
    }

    /**
     * 创建货架
     *
     * @param shelf 货架对象
     * @return 创建的货架对象
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Shelf create(Shelf shelf) {
        // 设置创建和更新时间
        Date now = new Date();
        shelf.setCreateTime(now);
        shelf.setUpdateTime(now);

        // 如果未设置状态，默认为启用
        if (shelf.getStatus() == null) {
            shelf.setStatus(1);
        }

        // 如果未设置容量，默认为100
        if (shelf.getCapacity() == null) {
            shelf.setCapacity(100);
        }

        // 插入货架
        shelfMapper.insert(shelf);

        return shelf;
    }

    /**
     * 更新货架
     *
     * @param id    货架ID
     * @param shelf 货架对象
     * @return 更新后的货架对象
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Shelf update(Long id, Shelf shelf) {
        // 查询原货架是否存在
        Shelf existingShelf = shelfMapper.selectById(id);
        if (existingShelf == null) {
            return null;
        }

        // 设置ID和更新时间
        shelf.setId(id);
        shelf.setUpdateTime(new Date());

        // 保留创建时间
        shelf.setCreateTime(existingShelf.getCreateTime());

        // 更新货架
        shelfMapper.update(shelf);

        return shelf;
    }

    /**
     * 删除货架
     *
     * @param id 货架ID
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean delete(Long id) {
        // 先删除货架上的所有商品
        shelfProductMapper.deleteByShelfId(id);

        // 再删除货架
        int result = shelfMapper.deleteById(id);
        return result > 0;
    }

    /**
     * 更新货架状态
     *
     * @param id     货架ID
     * @param status 状态（0-停用 1-启用 2-维护中）
     * @return 更新后的货架对象
     */
    @Override
    public Shelf updateStatus(Long id, Integer status) {
        // 查询原货架是否存在
        Shelf existingShelf = shelfMapper.selectById(id);
        if (existingShelf == null) {
            return null;
        }

        // 更新状态和更新时间
        Date now = new Date();
        existingShelf.setStatus(status);
        existingShelf.setUpdateTime(now);

        // 更新货架状态
        shelfMapper.updateStatus(id, status, now);

        return existingShelf;
    }

    /**
     * 计算货架当前负载
     *
     * @param shelfId 货架ID
     * @return 当前负载（商品数量）
     */
    @Override
    public int calculateCurrentLoad(Long shelfId) {
        List<ShelfProduct> products = shelfProductMapper.selectByShelfId(shelfId);
        int totalQuantity = 0;
        for (ShelfProduct product : products) {
            totalQuantity += product.getQuantity();
        }
        return totalQuantity;
    }
}
